home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / manifest_string.e < prev    next >
Text File  |  2000-03-25  |  9KB  |  392 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class MANIFEST_STRING
  17.    --
  18.    -- When using Manifest Constant STRING.
  19.    --
  20.  
  21. inherit EXPRESSION;
  22.  
  23. creation {EIFFEL_PARSER} make
  24.  
  25. feature
  26.  
  27.    start_position: POSITION;
  28.          -- Of the first character '%"'.
  29.  
  30.    to_string: STRING;
  31.          -- Eiffel contents of the string.
  32.  
  33. feature {NONE}
  34.  
  35.    break: ARRAY[INTEGER];
  36.          -- If not Void, places in `to_string' where extended notation (with
  37.          -- line(s) break) is used. The corresponding character in to string
  38.          -- is put on next line.
  39.  
  40.    ascii: ARRAY[INTEGER];
  41.          -- If not Void, places in `to_string' where character are to be
  42.          -- printed using asci code notation.
  43.  
  44.    percent: ARRAY[INTEGER];
  45.          -- If not Void, places in `to_string' where character are to be
  46.          -- printed using percent.
  47.  
  48. feature {MANIFEST_STRING,MANIFEST_STRING_POOL}
  49.  
  50.    mangling: STRING;
  51.          -- When runnable. Name to be used for the corresponding C
  52.          -- global variable or for the JVM corresponding field.
  53.  
  54. feature
  55.  
  56.    is_manifest_string: BOOLEAN is true;
  57.  
  58.    is_manifest_array: BOOLEAN is false;
  59.  
  60.    is_writable: BOOLEAN is false;
  61.  
  62.    is_current: BOOLEAN is false;
  63.  
  64.    is_static: BOOLEAN is false;
  65.  
  66.    is_void: BOOLEAN is false;
  67.  
  68.    is_result: BOOLEAN is false;
  69.  
  70.    use_current: BOOLEAN is false;
  71.  
  72.    is_pre_computable: BOOLEAN is true;
  73.  
  74.    c_simple: BOOLEAN is true;
  75.  
  76.    can_be_dropped: BOOLEAN is true;
  77.  
  78.    static_result_base_class: BASE_CLASS is
  79.       do
  80.          Result := small_eiffel.get_class(as_string);
  81.       end;
  82.  
  83.    result_type: TYPE_STRING is
  84.       do
  85.          Result := type_string;
  86.       end;
  87.  
  88.    assertion_check(tag: CHARACTER) is
  89.       do
  90.       end;
  91.  
  92.    static_value: INTEGER is
  93.       do
  94.       end;
  95.  
  96.    isa_dca_inline_argument: INTEGER is
  97.       do
  98.       end;
  99.  
  100.    dca_inline_argument(formal_arg_type: TYPE) is
  101.       do
  102.       end;
  103.  
  104.    mapping_c_target(target_type: TYPE) is
  105.       do
  106.          cpp.put_string(mangling);
  107.       end;
  108.  
  109.    mapping_c_arg(formal_arg_type: TYPE) is
  110.       do
  111.          compile_to_c;
  112.       end;
  113.  
  114.    collect_c_tmp is
  115.       do
  116.       end;
  117.  
  118.    compile_to_c is
  119.       do
  120.          cpp.put_character('(');
  121.          cpp.put_string(fz_cast_t0_star);
  122.          cpp.put_string(mangling);
  123.          cpp.put_character(')');
  124.       end;
  125.  
  126.    c_declare_for_old is
  127.       do
  128.       end;
  129.  
  130.    compile_to_c_old is
  131.       do
  132.       end;
  133.  
  134.    compile_to_jvm_old is
  135.       do
  136.       end;
  137.  
  138.    afd_check is
  139.       do
  140.       end;
  141.  
  142.    count: INTEGER is
  143.       do
  144.          Result := to_string.count;
  145.       end;
  146.  
  147.    compile_target_to_jvm, compile_to_jvm is
  148.       local
  149.          idx: INTEGER;
  150.       do
  151.          idx := fieldref_idx;
  152.          code_attribute.opcode_getstatic(idx,1);
  153.       end;
  154.  
  155.    compile_to_jvm_assignment(a: ASSIGNMENT) is
  156.       do
  157.       end;
  158.  
  159.    jvm_branch_if_false: INTEGER is
  160.       do
  161.       end;
  162.  
  163.    jvm_branch_if_true: INTEGER is
  164.       do
  165.       end;
  166.  
  167.    compile_to_jvm_into(dest: TYPE): INTEGER is
  168.       do
  169.          Result := 1;
  170.          compile_to_jvm;
  171.       end;
  172.  
  173.    to_runnable(ct: TYPE): MANIFEST_STRING is
  174.       do
  175.          if mangling = Void then
  176.             mangling := manifest_string_pool.register(Current);
  177.          end;
  178.          Result := Current;
  179.       end;
  180.  
  181.    stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  182.       do
  183.          Result := true;
  184.       end;
  185.  
  186.    precedence: INTEGER is
  187.       do
  188.          Result := atomic_precedence;
  189.       end;
  190.  
  191.    bracketed_pretty_print, pretty_print is
  192.       local
  193.          i, column: INTEGER;
  194.       do
  195.          from
  196.             column := fmt.column;
  197.             fmt.put_character('%"');
  198.             i := 1;
  199.          until
  200.             i > to_string.count
  201.          loop
  202.             if is_on_next_line(i) then
  203.                fmt.put_string("%%%N");
  204.                from
  205.                until
  206.                   column = fmt.column
  207.                loop
  208.                   fmt.put_character(' ');
  209.                end;
  210.                fmt.put_character('%%');
  211.             end;
  212.             pretty_print_character(i);
  213.             i := i + 1;
  214.          end;
  215.          fmt.put_character('%"');
  216.       end;
  217.  
  218.    print_as_target is
  219.       do
  220.          fmt.put_character('(');
  221.          pretty_print;
  222.          fmt.put_character(')');
  223.          fmt.put_character('.');
  224.       end;
  225.  
  226.    short is
  227.       local
  228.          i: INTEGER;
  229.       do
  230.          short_print.hook_or("open_ms","%"");
  231.          from
  232.             i := 1;
  233.          until
  234.             i > to_string.count
  235.          loop
  236.             short_character(i);
  237.             i := i + 1;
  238.          end;
  239.          short_print.hook_or("close_ms","%"");
  240.       end;
  241.  
  242.    short_target is
  243.       do
  244.          bracketed_short;
  245.          short_print.a_dot;
  246.       end;
  247.  
  248. feature {EIFFEL_PARSER}
  249.  
  250.    add(ch: CHARACTER) is
  251.          -- Append `ch' to manifest string setting ordinary printing mode.
  252.       do
  253.          to_string.extend(ch);
  254.       end;
  255.  
  256.    add_ascii(ch: CHARACTER) is
  257.          -- Append `ch' to manifest string setting `ascii' printing mode.
  258.       do
  259.          to_string.extend(ch);
  260.          if ascii = Void then
  261.             !!ascii.with_capacity(4,1);
  262.          end;
  263.      ascii.add_last(to_string.count);
  264.       end;
  265.  
  266.    add_percent(ch: CHARACTER) is
  267.          -- Append `ch' to manifest string setting `percent'  printing mode.
  268.       do
  269.          to_string.extend(ch);
  270.          if percent = Void then
  271.             !!percent.with_capacity(4,1);
  272.          end;
  273.      percent.add_last(to_string.count);
  274.       end;
  275.  
  276.    break_line is
  277.          -- Next character will be a `break'.
  278.       do
  279.          if break = Void then
  280.             !!break.with_capacity(4,1);
  281.          end;
  282.      break.add_last(to_string.count + 1);
  283.       end;
  284.  
  285. feature {CREATION_CALL,EXPRESSION_WITH_COMMENT}
  286.  
  287.    jvm_assign is
  288.       do
  289.       end;
  290.  
  291. feature {MANIFEST_STRING_POOL}
  292.  
  293.    fieldref_idx: INTEGER is
  294.       do
  295.          Result := constant_pool.idx_fieldref_for_manifest_string(mangling);
  296.       end;
  297.  
  298. feature {NONE}
  299.  
  300.    make(sp: like start_position) is
  301.       require
  302.          not sp.is_unknown
  303.       do
  304.          start_position := sp;
  305.          !!to_string.make(0);
  306.       ensure
  307.          start_position = sp
  308.       end;
  309.  
  310.    tmp_string: STRING is
  311.       once
  312.          !!Result.make(8);
  313.       end;
  314.  
  315.    pretty_print_character(i: INTEGER) is
  316.       require
  317.          1 <= i;
  318.          i <= count;
  319.       local
  320.          val: INTEGER;
  321.       do
  322.          if percent /= Void and then percent.fast_has(i) then
  323.             tmp_string.clear;
  324.             character_coding(to_string.item(i),tmp_string);
  325.             fmt.put_string(tmp_string);
  326.          elseif ascii /= Void and then ascii.fast_has(i) then
  327.             val := to_string.item(i).code;
  328.             fmt.put_string("%%/");
  329.             fmt.put_integer(val);
  330.             fmt.put_string(as_slash);
  331.          else
  332.             fmt.put_character(to_string.item(i));
  333.          end;
  334.       end;
  335.  
  336.    short_character(i: INTEGER) is
  337.       require
  338.          1 <= i;
  339.          i <= count;
  340.       local
  341.          val: INTEGER;
  342.          c: CHARACTER;
  343.       do
  344.          tmp_string.clear;
  345.          if percent /= Void and then percent.fast_has(i) then
  346.             character_coding(to_string.item(i),tmp_string);
  347.          elseif ascii /= Void and then ascii.fast_has(i) then
  348.             val := to_string.item(i).code;
  349.             tmp_string.append("%%/");
  350.             val.append_in(tmp_string);
  351.             tmp_string.append(as_slash);
  352.          end;
  353.          if tmp_string.count = 0 then
  354.             short_print.a_character(to_string.item(i));
  355.          else
  356.             from
  357.                val := 1;
  358.             until
  359.                val > tmp_string.count
  360.             loop
  361.                c := tmp_string.item(val);
  362.                if c = '%%' then
  363.                   short_print.hook_or("Prcnt_ms","%%");
  364.                elseif c = '/' then
  365.                   short_print.hook_or("Slash_ms",as_slash);
  366.                else
  367.                   short_print.a_character(c);
  368.                end;
  369.                val := val + 1;
  370.             end;
  371.          end;
  372.       end;
  373.  
  374.    is_on_next_line(i: INTEGER): BOOLEAN is
  375.       require
  376.          1 <= i;
  377.          i <= count;
  378.       do
  379.          if break /= Void then
  380.             Result := break.fast_has(i);
  381.          end;
  382.       end;
  383.  
  384. invariant
  385.  
  386.    not start_position.is_unknown;
  387.  
  388.    to_string /= Void;
  389.  
  390. end -- MANIFEST_STRING
  391.  
  392.